\chapter{Introdução} \label{C:Introducao}
Neste capítulo apresentamos a sintaxe básica do \textsf{GMPL}\nocite{gmpl} que baseia-se nos \textsf{tipos}
\begin{enumerate}
\item \textsf{número},
\item \textsf{nome},
\item \textsf{string},
\item \textsf{chave},
\item \textsf{delimitador},
\item \textsf{comentario},
\end{enumerate}
\textsf{expressões} e nos \textsf{objetos}
\begin{enumerate}
\item \textsf{parâmetro},
\item \textsf{conjunto},
\item \textsf{variável},
\item \textsf{restrição},
\item \textsf{função objetivo}.
\end{enumerate}

\section{\textsf{Tipos}}
\subsection{\textsf{Número}}
Um \textsf{número} é uma expressão que reprenta os números reais na base $10$ do tipo \lcode{xxEsyy}, onde \lcode{xx} é um número decimal, \lcode{s} é um dos símbolos \lcode{+} ou \lcode{-}, e \lcode{yy} é outro número decimal correspondendo a potência. A seguir alguns exemplos:
\begin{code}
123
3.14159
56.E+5
\end{code}

\subsection{\textsf{Nome}}
Um \textsf{nome} é uma sequência de caracteres alfanuméricos onde o primeiro caracter sempre é alfabético. A seguir alguns exemplos:
\begin{code}
alpha123
This_is_a_name
_P123_abc_321
\end{code}

\subsection{\textsf{String}}
Uma \textsf{string} é uma sequência de caracteres delimitada por aspas simples ou duplas. Caso na sequência de caracteres apresente aspas simples ou duplas estas devem ser digitadas duas vezes. A seguir alguns exemplos:
\begin{code}
’This is a string’
"This is another string"
’1 + 2 = 3’
’That’’s all’
"She said: ""No"""
\end{code}

\subsection{\textsf{Chave}}
Uma \textsf{chave} é uma sequência de caracteres que aciona alguma funcionalidade. Iremos descrevé-las quando necessário.

\subsection{\textsf{Delimitador}}
Um \textsf{delimitador} é um ou dois caracteres especiais que aciona alguma funcionalidade. Todos os delimitadores são apresentados a seguir:
\begin{center}
\begin{tabular}{cccccc}
\lcode{+} & \lcode{\textasciicircum} & \lcode{==} & \lcode{!} & \lcode{:} & \lcode{)} \\
\lcode{-} & \lcode{\&} & \lcode{\textgreater =} & \lcode{\&\&} & \lcode{;} & \lcode{]} \\
\lcode{\textasteriskcentered} & \lcode{\textless} & \lcode{\textgreater}  & \lcode{\textbar \textbar} & \lcode{:=} & \lcode{\textbar} \\
\lcode{/} & \lcode{\textless =} & \lcode{\textless \textgreater} & \lcode{.} & \lcode{..} & \lcode{\{} \\
\lcode{\textasteriskcentered \textasteriskcentered} & \lcode{=} & \lcode{!=} & \lcode{,} & \lcode{(} & \lcode{\}}
\end{tabular}  
\end{center}

\subsection{\textsf{Comentário}}
Um \textsf{comentário} é qualquer sequência de caracteres, iniciada com \lcode{\#}, utilizadas para documentação. Um \textsf{comentário} também pode ser iniciado por \lcode{/\textasteriskcentered} e terminado por \lcode{\textasteriskcentered /}.

\section{\textsf{Expressões}}
\textsf{Expressões} são regras para o cálculo de algum valor que é representado como algum \textsf{tipo}.
\subsection{Conjuntos}


\section{\textsf{Objetos}}
\subsection{Parâmetros}
Um parâmetro é qualquer valor numérico que para uma instância de determinado problema comporta-se como uma constante. A sintaxe a ser utilizada é:
\begin{code}
param <nome> <pseudônimo> <dominio> , <atributos> ;
\end{code}
onde \lcode{\textgreat nome \textless} \ é uma o nome do parâmetro, \lcode{\textgreat pseudônimo \textless} \ é o nome do parâmetro, 
Qualquer outra constante pode ser declarada de maneira similar seguinto a sintaxe:
\begin{code}


\end{code}
onde \lcode{\textless tipo\textgreater} \ é um dos seguintes tipos primitivos: \lcode{int}, \lcode{double}.

Em muitos problemas é comum existir um ou mais conjuntos. A declaração de um conjunto pode ser feita de várias maneiras dependendo dos elementos do conjunto. A seguir apresentamos alguns exemplos de conjuntos:
\begin{enumerate}
 \item conjunto de números:
\begin{code}
{int} I = {1, 2, 3};
\end{code}
 \item conjunto de números em sequencia:
\begin{code}
{int} I = {1:3};
\end{code}
 \item conjunto de strings:
\begin{code}
{string} I = {'um', 'dois', 'três'};
\end{code}
\end{enumerate}

Uma vez definido um conjunto podemos utilizá-lo para definir um vetor utilizando a seguinte sintaxe:
\begin{code}
int A[I] = [5, 10, 15];
\end{code}

\subsection{Parâmetros em arquivo separado}

\section{Variáveis}
Uma parte muito importante de qualquer modelo são as variávies utilizadas. A declaração de uma variável utiliza a seguinte sintaxe:
\begin{code}
dvar <tipo> <nome da variável>;
\end{code}
Também é possível declarar um vetor de variáveis utilizando a seguinte sintaxe:
\begin{code}
dvar <tipo> <nome da variável>[<conjunto>];
\end{code}

\subsection{Operações}
As operações aritméticas permitidas são:

\subsection{Função Objetivo}
Caso o problema seja de maximização declaramos a função objetivo seguindo a sintaxe:
\begin{code}
maximize <operações aritméticas>;
\end{code}
Se o problema for de minimização trocamos \lcode{maximize} por \lcode{minimize}.

\subsection{Restrições}
Para as restrições utilizamos a seguinte sintaxe:
\begin{code}
subsect to {
  <desigualdade 1>;
  <desigualdade 2>;
  <...>;
}
\end{code}
